import dayjs from 'dayjs'
import quarterOfYear from 'dayjs/plugin/quarterOfYear'
dayjs.extend(quarterOfYear)

const FORMAT = 'DD/MM/YYYY'
const FORMATTIME = 'DD/MM/YYYY HH:mm'
const FORMATDATE = 'DD/MM'
const FORMATCODE = 'YYYYMMDDHHmmss'

class Time{
  // 传入核心
  constructor(data) {
    // 判断类型
    this.app = typeof data == 'object' ? dayjs(data) : dayjs.unix(data)
  }

  // 获取对象
  toDate() {
    return this.app.toDate()
  }

  // 获取原对象
  raw() {
    return this.app
  }

  // code
  code() {
    return this.app.format(FORMATCODE)
  }

  // 格式化
  format() {
    return this.app.format(FORMATTIME)
  }

  //日期
  date() {
    return this.app.format(FORMAT)
  }

  // 时间
  time() {
    return this.app.format('HH:mm:ss')
  }

  // 简化日期
  dateSmall() {
    return this.app.format(FORMATDATE)
  }

  // 年
  year() {
    return this.app.year() 
  }

  // 季度
  quarter() {
    return this.app.quarter() - 1
  }

  // 月
  month() {
    return this.app.month()
  }

  // 日
  day() {
    return this.app.date()
  }

  // 获取时间戳
  unix() {
    return this.app.unix()
  }

  // 今天开始
  dayStart() {
    this.app = this.app.startOf('day')

    return this
  }

  // 今天截止
  dayEnd() {
    this.app = this.app.endOf('day')

    return this
  }

  // 增加天
  addDay(num) {
    this.app = this.app.add(num, 'day')

    return this
  }

  // 减少天
  subDay(num) {
    this.app = this.app.subtract(num, 'day')

    return this
  }

  // 增加秒
  addSecond(num) {
    this.app = this.app.add(num, 'second')

    return this
  }

  // 减少秒
  subSecond(num) {
    this.app = this.app.subtract(num, 'second')

    return this
  }

  // 减少年份
  subYear(num) {
    this.app = this.app.subtract(num, 'year')

    return this
  }

  // 开始年
  yearStart() {
    this.app = this.app.startOf('year')

    return this
  }

  // 结束年
  yearEnd() {
    this.app = this.app.endOf('year')

    return this
  }

  // 季度开始
  quarterStart() {
    this.app = this.app.startOf('quarter')

    return this
  }

  // 季度结束
  quarterEnd() {
    this.app = this.app.endOf('quarter')

    return this
  }

  // 最多截止到今天
  today() {
    const now = dayjs()
    if(this.app.isAfter(now)) {
      this.app = now 
    }

    return this
  }

  // 在时间之后
  isAfter(time) {
    return this.app.isAfter(time.raw())
  }

  // ISO
  iso() {
    return this.app.toISOString()
  }
}

export default {
  // 载入时间
  load(data) {
    return new Time(data)
  },

  // 起始与结束
  range(arr) {
    return [
      this.load(arr[0]).unix(),
      this.load(arr[1]).dayEnd().unix()
    ]
  },

  // 格式
  format() {
    return FORMAT
  },

  formatTime() {
    return FORMATTIME
  },

  // 获取Code
  code() {
    const time = this.load(dayjs())
    return time.code()
  },

  // 解析年
  parse(year, month = 0, day = 1) {
    return this.load(new Date(year, month, day))
  },

  // 当前
  now() {
    return this.load(new Date)
  },

  raw(text) {
    return this.load(new Date(text))
  }
}